package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(6,7));
        list.add(new Point(5,1));
        list.add(new Point(78,99));
        list.add(new Point(8,43));
        System.out.println(list);
        /*
            编译不通过的原因:
            该sort方法要求元素必须实现Comparable接口

            不推荐Point去实现该接口，原因是这样做对我们的代码产生了侵入性
            侵入性:
            当我们使用某个API的方法，该方法要求我们为其实现接口，继承类并重写方法
            等操作(就是我们要额外修改其他地方的代码)。
            侵入性是不利于后期代码的维护的，应当尽量避免。
         */
//        Collections.sort(list);//编译不通过

        //为Point定义一个比较规则:点到原点长的大
        //为哪个类定义比较器泛型就指定哪个类
//        Comparator<Point> c = new Comparator<Point>() {
//            public int compare(Point o1, Point o2) {//compare:比较
//                //计算o1点到原点的距离(忽略开方，因为是求谁更长，不是求精确长度)
//                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                //计算o2点到原点的距离
//                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                /*
//                    返回值表示o1与o2的大小关系有三种情况:
//                    o1>o2:应当返回一个>0的数
//                    o1<o2:应当返回一个<0的数
//                    o1=o2:应当返回0
//                 */
//                return len1-len2;
//            }
//        };
        /*
            重载的sort方法会根据我们传入的比较将list集合元素两两比较，然后根据大小
            关系进行从小到大排序。
         */
//        Collections.sort(list,c);


        Collections.sort(list,new Comparator<Point>() {
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;
            }
        });

        System.out.println(list);

    }
}



